#!/usr/bin/env.python
# _*_ coding:utf-8 _*_
# # # # # # # # # # # # # # # # # # # #
#  题目:      自定义文件存储系统         #
#  姓名:         李吉辉                #
#  时间:    2018年12月27日21:11:40     #
# # # # # # # # # # # # # # # # # # # #

from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client
from django.conf import settings


class FastDFSStorage(Storage):
    """自定义文件存储系统"""

    def __init__(self, client_conf=None, base_url=None):
        """初始化方法"""
        # self.client_conf = client_conf
        # if client_conf:
        #     self.client_conf = client_conf
        # else:
        #     self.client_conf = settings.FDFS_CLIENT_CONF
        # self.client_conf = client_conf if client_conf else settings.FDFS_CLIENT_CONF

        # 或运算 判断  一真则真
        self.client_conf = client_conf or settings.FDFS_CLIENT_CONF
        self.base_url = base_url or settings.FDFS_BASE_URL


    def _open(self, name, mode='rb'):
        """
        打开storage中上传的文件,我们只是为了上传文件所以不需要打开,但是官方要求必须重写,所以重写后什么也不做
        :param name: 表示要打开的文件名
        :param mode: 打开文件的模式 read bytes
        """
        pass

    def _save(self, name, content):
        """
        当保存时就会调用此方法
        :param name: 要保存的文件名
        :param content: 要保存的文件对象
        :return: file_id  把上传后的文件路径返回
        """
        # 1.创建client
        # client = Fdfs_client('meiduo_mall/utils/fastdfs/client.conf')
        # client = Fdfs_client(settings.FDFS_CLIENT_CONF)
        client = Fdfs_client(self.client_conf)
        # 2.上传文件到fastdfs
        # ret = client.upload_by_filename("此方法只用通过文件本地绝对路径来上传"),此方法上传的图片,在storage中有文件后缀
        #      客户端 --> 上传二进制格式 --> 文件对象.读取
        ret = client.upload_by_buffer(content.read())  # 把要上传的文件二进制传入进行上传,上传的图片没有后缀

        # 3.判断上传是否成功
        if ret.get('Status') != 'Upload successed.':
            raise Exception('Upload file failed')

        # 4.如果能执行到这里说明文件上传成功, 返回
        return ret.get('Remote file_id')


    def exists(self, name):
        """
        此方法只返回bool值,如果返回True表示要上传的文件已存在,就不会再上传,如果返回False表示当前要上传的文件不存在,
        可以上传
        name: 要上传的文件名
        """
        return False

    def url(self, name):
        """
        返回上传到fastdfs中路径的绝对路径给浏览器访问使用
        name: 就是上传到fastdfs中的file_id
        """
        # return 'http://192.168.25.88:8888/' + name
        # return settings.FDFS_BASE_URL + name
        return self.base_url + name  #  admin站点使用会调用该方法展示给用户,  主是为了多服务器服务,不写死ip


"""

{'Group name': 'group1',
 'Remote file_id': 'group1\\M00/00/00/wKgZWFwkwCuABNavAACZ3pK2uAA840
.jpg',
 'Status': 'Upload successed.',
 'Local file name': 'D:/heimaPython/2012814183741729.jpg',
 'Uploaded size': '38.00KB',
 'Storage IP': '192.168.25.88'}


"""